home *** CD-ROM | disk | FTP | other *** search
- .include "global.s"
-
- .PAL_01 = 0x00
- .PAL_23 = 0x01
- .PAL_03 = 0x02
- .PAL_12 = 0x03
- .ATTR_BLK = 0x04
- .ATTR_LIN = 0x05
- .ATTR_DIV = 0x06
- .ATTR_CHR = 0x07
- .SOUND = 0x08
- .SOU_TRN = 0x09
- .PAL_SET = 0x0A
- .PAL_TRN = 0x0B
- .ATRC_EN = 0x0C
- .TEST_EN = 0x0D
- .ICON_EN = 0x0E
- .DATA_SND = 0x0F
- .DATA_TRN = 0x10
- .MLT_REQ = 0x11
- .JUMP = 0x12
- .CHR_TRN = 0x13
- .PCT_TRN = 0x14
- .ATTR_TRN = 0x15
- .ATTR_SET = 0x16
- .MASK_EN = 0x17
- .OBJ_TRN = 0x18
-
- .area _CODE
-
- ;; Check if running on SGB
- ;; Set A to 0xFF when running on SGB
- ;; Clear A when running on DMG
- .sgb_check::
- _sgb_check::
- LD HL,#.MLT_REQ_2
- CALL .sgb_transfer
- CALL .wait4
- LDH A,(.P1)
- AND #0x03
- CP #0x03
- JR NZ,.sgb_mode
-
- LD A,#0x20 ; Controller read (dummy)
- LDH (.P1),A
- LDH A,(.P1)
- LDH A,(.P1)
- CPL
- AND #0x0F
- SWAP A
- LD B,A
- LD A,#0x30
- LDH (.P1),A
- LD A,#0x10
- LDH (.P1),A
- LDH A,(.P1)
- LDH A,(.P1)
- LDH A,(.P1)
- LDH A,(.P1)
- LDH A,(.P1)
- LDH A,(.P1)
- LD A,#0x30
- LDH (.P1),A
- LDH A,(.P1)
- AND #0x03
- CP #0x03
- JR NZ,.sgb_mode
-
- .dmg_mode:
- ; LD HL,#.MLT_REQ_1
- ; CALL .sgb_transfer
- ; CALL .wait4
- XOR A
- RET
-
- .sgb_mode:
- LD HL,#.MLT_REQ_1
- CALL .sgb_transfer
- CALL .wait4
- LD A,#0xFF
- RET
-
- .sgb_transfer::
- LD A,(HL) ; Top of command data
- AND #0x03
- RET Z
- LD B,A ; Number of translated packet
- LD C,#0x00 ; Lower part of #FF00
- 1$:
- PUSH BC
- XOR A ; Start to write
- LDH (C),A
- LD A,#0x30
- LDH (C),A
- LD B,#0x10 ; Set counter to transfer 16 byte
- 2$: LD E,#0x08 ; Set counter to transfer 8 bit
- LD A,(HL+)
- LD D,A
-
- 3$:
- BIT 0,D
- LD A,#0x10 ; P14 = high, P15 = low (output "1")
- JR NZ,4$
- LD A,#0x20 ; P14 = low, P15 = high (output "0")
- 4$:
- LDH (C),A
- LD A,#0x30 ; P14 = high, P15 = high
- LDH (C),A
- RR D ; Shift 1 bit to right
- DEC E
- JR NZ,3$
-
- DEC B
- JR NZ,2$
- LD A,#0x20 ; 129th bit "0" output
- LDH (C),A
- LD A,#0x30
- LDH (C),A
-
- POP BC
- DEC B
- RET Z
- CALL .wait4 ; Software wait for about 4 frames
- JR 1$
-
- .wait4:
- LD DE,#7000
- .1$:
- NOP ; 1 +
- NOP ; 1 +
- NOP ; 1 +
- DEC DE ; 2 +
- LD A,D ; 1 +
- OR E ; 1 +
- JR NZ,.1$ ; 3 = 10 cycles
- RET
-
- .area _CODE
-
- .MLT_REQ_1:
- .byte (.MLT_REQ<<3)|1,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- .MLT_REQ_2:
- .byte (.MLT_REQ<<3)|1,0x01,0x00,0x00,0x00,0x00,0x00,0x00
- .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-